package com.cs.paoyer.administration.business.entity;

//import java.sql.BatchUpdateException;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
//import java.util.HashMap;
//import java.util.Vector;
import java.util.ArrayList;
import java.sql.PreparedStatement;
//import java.util.Iterator;

import com.cs.paoyer.administration.business.model.ProgramVO;
//import com.cs.paoyer.common.util.Encrypter;
//import java.security.NoSuchAlgorithmException;
//
//import com.cs.paoyer.common.exception.UserException;
//import com.cs.paoyer.common.exception.SystemException;

/**
 * DAO para crear, consultar y actualizar registros en la tabla TCS_PROGRAMA.
 * 
 * @author Rene.Rangel@consultsoft.com
 * @version 1.0
 */

public class ProgramDAO  
{
  /**
   * Conexion a la base de datos.
   */
  private Connection conn = null;

  /**
   * Constructor que inicializa la conexion con la base de datos.
   * @param conn Conexion con la base de datos.
   */
  
  public ProgramDAO(Connection conn){
    this.conn = conn;
  }

/**
  * Consulta un grupo de registros de la tabla TCS_PROGRAMA a partir
  * de las condiciones que vienen en el Value Object
  *
  * @param ProgramVO      Value Object con las condiciones a tener encuenta.
  * 
  * @return Collection     Arreglo de registros retornados de la consulta.
  */  
    public Collection findProgramByCriterea(ProgramVO criterea) throws SQLException 
    {
    
    /**
     * Aqui la busqueda se hace en la tabla Tcs_Programa 
     */
    
    
    String query = "SELECT prog.codigo, prog.nombre, prog.descripcion, "  +
                    "prog.usuario_crea, prog.terminal_crea, "  +
                    "prog.usuario_modifica, prog.terminal_modifica, "  +
                    "TO_CHAR(prog.desde_vigencia,'yyyy-mm-dd' ) desde_vigencia, "  +
                    "TO_CHAR(prog.hasta_vigencia,'yyyy-mm-dd' ) hasta_vigencia, "  +
                    "prog.vigencia, prog.tipo_progr, prog.ubicacion, "  +
                    "prog.version, prog.estandar_cs "  +
                    "FROM tcs_programa prog "+
                    "WHERE ROWNUM <= 51 ";

    String filters = "";
    // Filtro por Nombre
    if ( (criterea.getName() != null) && !(criterea.getName().equals("")) ) {
      filters = filters + " AND UPPER(prog.nombre) LIKE '%" + criterea.getName().toUpperCase() + "%' " ;
    }

    // Filtro por Descripcion
    if ( (criterea.getDescription() != null) && !(criterea.getDescription().equals("")) ) {
      filters = filters + " AND UPPER(prog.descripcion) LIKE '%" + criterea.getDescription().toUpperCase() + "%' ";
    }

    

    // Filtro por Tipo de Programa
    if ( (criterea.getProgramType() != null) && !(criterea.getProgramType().equals("")) ) {
      filters = filters + " AND prog.tipo_progr ='" + criterea.getProgramType().toUpperCase()+"'";
    }

    
    // Filtro por Ubicacion
    if ( (criterea.getTarget() != null) && !(criterea.getTarget().equals("")) ) {
      filters = filters + " AND prog.ubicacion = '" + criterea.getTarget().toUpperCase()+"'";
    }

    // Filtro por Version
    if ( (criterea.getVersion() != null) && !(criterea.getVersion().intValue()== 0) )  {
      filters = filters + " AND prog.version =" + criterea.getVersion();
    }

    // Filtro por Indicador EstandarCS
    if ( (criterea.getCsEstandar() != null) && !(criterea.getCsEstandar().equals("")) ) {
      filters = filters + " AND prog.estandar_cs = '" + criterea.getCsEstandar().toUpperCase()+"'";
    }

    // Filtro por Desde Vigencia
    if (criterea.getEffectiveFrom() != null && !(criterea.getEffectiveFrom().equals(""))) {
      filters = filters + " AND prog.desde_vigencia = to_date('" + criterea.getEffectiveFrom()+"','yyyy-mm-dd')";
    }

    // Filtro por Hasta Vigencia
    if (criterea.getEffectiveUntil() != null  && !(criterea.getEffectiveUntil().equals(""))) {
      filters = filters + " AND prog.hasta_vigencia = to_date('" + criterea.getEffectiveUntil()+"','yyyy-mm-dd')";
    }

    // Filtro por Vigencia
    if (criterea.getUse() != null    && !(criterea.getUse().equals(""))    ) {
      filters = filters + " AND prog.vigencia = '" + criterea.getUse().toUpperCase()+"'";
    }

    // Filtro por Codigo
    if (criterea.getCode() != null    && !(criterea.getCode().intValue() == 0 )    ) {
      filters = filters + " AND prog.codigo = " + criterea.getCode();
    }


    // Si hay filtros, entonces armar la clausula WHERE 
    if ( !filters.equalsIgnoreCase("") ) {
      query = query + filters;
    }
    Statement stm = null;
    ResultSet rst = null;
    ArrayList programs = new ArrayList();
   
    stm = conn.createStatement();
    rst = stm.executeQuery(query);
    ProgramVO program = null;
    while ( rst.next() ) 
    {
        program = new ProgramVO();
        program.setCode(new Long(rst.getLong( "codigo")));      
        program.setName(rst.getString( "nombre"));
        program.setDescription(rst.getString( "descripcion"));
        program.setWebUserCrea(rst.getString( "usuario_crea"));
        program.setWebClientCrea(rst.getString( "terminal_crea"));
        program.setWebUserModif(rst.getString( "usuario_modifica"));
        program.setWebClientModif(rst.getString( "terminal_modifica"));
        program.setEffectiveFrom(rst.getString( "desde_vigencia"));      
        program.setEffectiveUntil(rst.getString( "hasta_vigencia"));      
        program.setUse(rst.getString( "vigencia"));
        program.setProgramType(rst.getString("tipo_progr"));
        program.setTarget(rst.getString("ubicacion"));
        program.setVersion(new Short(rst.getShort("version")));
        program.setCsEstandar(rst.getString("estandar_cs"));
        
        programs.add(program);
        program = null;
   }
         
    
   stm.close();
       
   return programs;
  }
  
  
  
/**
  * Crea un nuevo registro en la tabla TCS_PROGRAMA.
  *
  * @param ProgramVO      Value Object con el registro
  *                       que se va a Crear.
  * 
  * @return ProgramVO     Registro creado.
  *
  */  
  public ProgramVO createProgram( ProgramVO newProgram ) throws SQLException {
  
    String strSQL="";
    boolean result=false;
    PreparedStatement ps=null;
           strSQL = "" +
             "INSERT INTO tcs_programa (codigo, nombre, descripcion, usuario_crea, "  +
             "  terminal_crea, usuario_modifica, terminal_modifica, " +
             "  tipo_progr, ubicacion) " +
             "VALUES(scs_programa.nextval,?,?,?,?,?,?, "+
             "?,?)";
             
    ps = conn.prepareStatement( strSQL );
    ps.setString(1, newProgram.getName().toUpperCase());
    ps.setString(2, newProgram.getDescription().toUpperCase());
    ps.setString(3, newProgram.getWebUserCrea());
    ps.setString(4, "WEB="+newProgram.getWebClientCrea());
    ps.setString(5, newProgram.getWebUserModif());
    ps.setString(6, "WEB="+newProgram.getWebClientModif());
   // ps.setString(7, newProgram.getEffectiveFrom());
   // ps.setString(8, newProgram.getEffectiveUntil());
  //  ps.setString(9, newProgram.getUse().toUpperCase());
    ps.setString(7, newProgram.getProgramType().toUpperCase());
    ps.setString(8, newProgram.getTarget().toUpperCase());
   // ps.setShort(12, newProgram.getVersion().shortValue());
  //  ps.setString(13, newProgram.getCsEstandar());
    
    
    result = ps.execute();

    if ( !result ) {
      Statement stm = conn.createStatement();
      ResultSet rst = stm.executeQuery("SELECT scs_programa.currval FROM dual");
      if ( rst.next() ) {
        newProgram.setCode( new Long(rst.getLong( 1 ) ) );
      }
      stm.close();
      rst.close();
    }

    ps.close();
    
    return newProgram;
  }

/**
  * Actualiza un registro en la tabla TCS_PROGRAMA por la llave primaria.
  *
  * @param ProgramVO      Value Object con el registro
  *                       que se va a modificar.
  * 
  * @return ProgramVO     Registro modificado.
  *
  */
  public ProgramVO updateProgram( ProgramVO program ) throws SQLException {
    
      String strSQL = "UPDATE tcs_programa "  +
                      "SET nombre = ?, "  +
                      "descripcion = ?, "  +
                      "usuario_modifica = ?, "  +
                      "terminal_modifica = ?, "  +
                      //"desde_vigencia = TO_DATE(?,'yyyy-mm-dd'), "  +
                     // "hasta_vigencia = TO_DATE(?,'yyyy-mm-dd'), "  +
                      //"vigencia = ?, "  +
                      "tipo_progr = ?, "  +
                      "ubicacion = ? "  +
                      //"version = ?, "  +
                     // "estandar_cs = ? "  +
                      "where codigo = ?";
                      
      PreparedStatement ps = conn.prepareStatement( strSQL );
      ps.setString(1, program.getName().toUpperCase());
      ps.setString(2, program.getDescription().toUpperCase());
      ps.setString(3, program.getWebUserModif());
      ps.setString(4, "WEB="+program.getWebClientModif());
     // ps.setString(5, program.getEffectiveFrom());
     // ps.setString(6, program.getEffectiveUntil());
     // ps.setString(7, program.getUse().toUpperCase());
      ps.setString(5, program.getProgramType().toUpperCase());
      ps.setString(6, program.getTarget());
     // ps.setShort(10, program.getVersion().shortValue());
    //  ps.setString(11, program.getCsEstandar());
      ps.setLong(7, program.getCode().longValue());
      
      int updates = ps.executeUpdate();
  
      if ( updates == 0 ) {
        return  null;
      }
  
      ps.close();
      
      return program;
    
  }

/**
  * Borra un registro de la tabla TCS_PROGRAMA por la llave primaria.
  *
  * @param ProgramVO      Value Object con el registro
  *                       que se va a borrar.
  * 
  * @return boolean         Indicador de exito de la operacion de borrado
  */
  public boolean deleteProgram( ProgramVO program ) throws SQLException {
    
      String strSQL = "DELETE tcs_programa " +
                      "WHERE codigo = ?";
      PreparedStatement ps = conn.prepareStatement( strSQL );
      ps.setLong(1, program.getCode().longValue());
      boolean deletes = ps.execute();
      ps.close();
      return  deletes;
  }

}